package main

import "fmt"

// 父类
type Animal struct {
	Name string
}

// 指针接受者是为了修改创建的对象中的值，否则其它时候没有区别
func (a Animal) Eat() {
	fmt.Println("正在吃东西")
}
func (a Animal) Drink() {
	fmt.Println("正在喝水")
}
func (a Animal) Run() {
	fmt.Println(a.Name, "正在奔跑")
}
func (a Animal) Sleep() {
	fmt.Println("正在睡觉")
}

// 子类Dog，继承父类Animal
type Dog struct {
	Animal Animal // 继承了父类
	Age    int
	Color  string
}

// 给子类添加方法
func (d Dog) Bark() {
	fmt.Println(d.Animal.Name, "正在汪汪叫")
}

func main() {
	// 通过子类Dog实例化对象
	// 组合：在子类中嵌套了父类
	d1 := Dog{
		Animal: Animal{Name: "大黄"},
		Age:    3,
		Color:  "黄色",
	}
	fmt.Println(d1)
	// 父类属性
	fmt.Println(d1.Animal.Name)
	// 调用父类方法
	d1.Animal.Run()
	// 调用子类方法
	d1.Bark()

}
